package com.qf;

import com.qf.pojo.User;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.Test;
import org.springframework.util.SerializationUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Pipeline;

import java.util.Date;

/**
 * 测试 官方的Jedis客户端
 * @author lixu
 */
public class JedisDemo {

    /**
     * 添加
     */
    @Test
    public void testAdd(){

        //1:Jedis客户端连接Redis服务器 192.168.200.129  6379
        Jedis jedis = new Jedis("192.168.200.129",6379);
        //2:命令 客户端
        jedis.set("java客户端","测试数据");//
        //重点  五大数据类型
        //jedis.zadd
        //jedis.get()
        //3:
        jedis.close();
    }
    /**
     * Jedis存储一个对象到Redis以byte[]的形式
     *
     * 对象流 二进制 字节数组
     */
    @Test
    public void testAddByteArray(){

        //1:Jedis客户端连接Redis服务器 192.168.200.129  6379
        Jedis jedis = new Jedis("192.168.200.129",6379);//创建连接
        //2:将对象保存在Redis服务器中
        User user = new User(123,"gp14",new Date());
        //2.1 Key值
        byte[] byteKey = "用户对象".getBytes();
        //3:将对象直接转成byte[]
        byte[] byteUser1 = SerializationUtils.serialize(user);
        jedis.set(byteKey,byteUser1);
        ////////////////
        //4查询出来
        byte[] byteUser2 = jedis.get(byteKey);
        User user2 = (User) SerializationUtils.deserialize(byteUser2);
        System.out.println(user2);

        jedis.close();

    }
    /**
     * Jedis连接池
     */
    @Test
    public void testJedisPool(){
        //1. 创建连接池配置信息
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        poolConfig.setMaxTotal(100);  // 连接池中最大的活跃数
        poolConfig.setMaxIdle(10);   // 最大空闲数
        poolConfig.setMinIdle(5);   // 最小空闲数
        poolConfig.setMaxWaitMillis(3000);  // 当连接池空了之后,多久没获取到Jedis对象,就超时
        //1:连接池  Spring的容器中实例化
        JedisPool jedisPool = new JedisPool(poolConfig,
                "192.168.200.129",6379,2000,"123456");//连接上Redis的服务器

        //2:从连接池中获取一次连接Redis的连接
        Jedis jedis = jedisPool.getResource();
        //3：选择要操作的Redis的库 号
        jedis.select(15);
        //4:保存数据
        jedis.set("ll","ww");

        jedis.close();


    }

    /**
     * 普通连接的时间测试
     */
    @Test
    public void testP1(){
        //开始时间
        long startTime = System.currentTimeMillis();
            //1:创建一次 发送一次命令
            Jedis jedis = new Jedis("192.168.200.129",6379);//创建连接

        for (int i = 0; i < 100000; i++) {
            jedis.set("key:" + i,"value:" + i);
        }
        //结束时间
        long endTime = System.currentTimeMillis();
        System.out.println("耗时:" + (endTime - startTime));//单位是ms


        //1. 创建连接池配置信息
/*        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        poolConfig.setMaxTotal(100);  // 连接池中最大的活跃数
        poolConfig.setMaxIdle(10);   // 最大空闲数
        poolConfig.setMinIdle(5);   // 最小空闲数
        poolConfig.setMaxWaitMillis(3000);  // 当连接池空了之后,多久没获取到Jedis对象,就超时
        //1:连接池  Spring的容器中实例化
        JedisPool jedisPool = new JedisPool(poolConfig,"192.168.200.129",6379);//连接上Redis的服务器

        //开始时间
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            Jedis jedis = jedisPool.getResource();
            jedis.set("key:" + i,"value:" + i);
            jedis.close();
        }
        //结束时间
        long endTime = System.currentTimeMillis();
        System.out.println("耗时:" + (endTime - startTime));//单位是ms*/
    }
    /**
     * 管道操作
     *
     * 实验1： 没有连接池   耗时:91857ms
     * 实验2： 有连接池     耗时:36820ms
     * 实验3： 管道操作     耗时:146ms
     */
    @Test
    public void testPipelined(){
        //1:测试一次管道
        Jedis jedis = new Jedis("ip",6379);//创建连接
        jedis.auth("123456");//设置密码
        //2:获取管道
        Pipeline pipelined = jedis.pipelined();


        //开始时间
        long startTime = System.currentTimeMillis();

        for (int i = 0; i < 100000; i++) {
            //往管道中设置10万个命令
            pipelined.set("key:" + i, "value:" + i);
        }
        //一口气执行
        pipelined.syncAndReturnAll();//
        //结束时间
        long endTime = System.currentTimeMillis();
        System.out.println("耗时:" + (endTime - startTime));//单位是ms
    }
}
